<?php

/**
 * User_RestoreController
 * 
 * Генерация нового пароля и отсылка его на указаный имэйл
 * 
 * @package   Basic
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 */
 
class User_RestoreController extends Lord_Controller_Action 
{
	
/*------------------------------------------------------------------------------*/

	/**
	 * Индексный метод.
	 * Показывает форму напоминания пароля и обрабатывает ее
	 */
	 
	public function indexAction()
	{
		// показываем форму
		$form = $this->_form();
		$this->view->form = $form; 
			  
		// валидация   
		if (!empty($_POST)) 
		{     
			if (!$form->isValid($_POST)) 
			{   
				// показываем сообщение об ошибке
				$this->view->err = 'form_fail';
				// получаем невалидные значения, введенные в форму         
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors(); 
				// показываем форму с невалидными данными
				return $this->view->form = $this->_form($values, $errors);
			}
		}
		
		/**
		* обрабатываем форму
		*/
		if ($this->_request->isPost()) 
		{    
			// получаем валидные данные из формы
			$values = $form->getValues(); 
			// пытаемся найти в базе юзера с таким имэйлом
			$data = $this->model->fetchRow('email="' . $values['email'] . '"');
			// если юзера не нашли - нам пытаются скормить левый email
			if(empty($data))
			{
				// выдаем сообщение о неправильном имэйле
				return $this->view->err = 'restore_fail';	
			}
			// если нашли пользователя с таким имэйлом
			else
			{
				// генерируем новый пароль
				$newPass = rand(0, 9999999);
				// отправляем нужные данные в шаблон письма
				$this->view->pass = $newPass;
				$this->view->data = $data;
				// обновляем старый на новый в базе
				$tmp['password'] = md5($newPass);
				$model->update($tmp, 'email = "' . $values['email'] . '"');
				
				/**
				* отправляем письмо с паролем
				*/
				// зачитываем конфиг				
				$config = $this->_helper->config();
				// инстанцируем Zend_Mail, не забыв указать кодировку
				$mail = new Zend_Mail($config->common->charset);
				// тело сообщения
				$mail->setBodyHtml($this->view->render('restore/index_letter.tpl'));
				// имя и адрес отправителя
				$mail->setFrom($config->common->siteMail, $config->common->siteName);
				// имя и адрес получателя
				$mail->addTo( $values['email'], $data['name']);
				// тема письма
				$mail->setSubject( $config->common->siteName . ': ' . $this->view->translate('user_restore_index_letter_theme'));
				// отправляем
				$mail->send();			
				
				// показываем сообщение
				return $this->view->msg = 'user_restore_index_ok';	
			}
		} 
	}

/*==============================================================================*/

	/**
	* Приватный метод для проверки айдишника записи
	*/
	
	private function _checkId()
	{
		$id = $this->_getParam('id');
		
		if((int)$id == 0 
			or $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return $this->_redirect('');
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/
	
	/**
	* Приватный метод для построения формы
	* Используется при добавлении и редактировании
	* В качестве аргумента принимает уже заполненые 
	* данные (при редактировании)
	* 
	* @param $data array 
	* @param $errors array
	* @param $action string
	* @return object
	*/
	private function _form($data = array(), $errors = array(), $action = 'add')
	{    
		$form = new Lord_Form_Form();
		$form->setAction( '/' . $this->_moduleName.
						  '/' . $this->_controllerName)
			 ->setMethod('post');  
		

		// Используемый собственный элемент Lord_Form_Element_Email
		$email = new Zend_Form_Element_Text('email', array(
			'label'       => $this->view->translate('user_restore_form_email'),
			'maxlength'   => '50',
			'value'       => (!empty($data['email'])) ? $data['email'] : '',
			'required'    => true,
			'validators'  => array('EmailAddress'),
		));
		$form->addElement($email); 	
                
        // Элемент CAPTCHA, защита от спама
        if($this->_helper->config()->captcha_restore == 1)
        {
            $captcha = new Zend_Form_Element_Captcha('captcha', array(
                'label' => $this->view->translate("user_restore_form_captcha"),
                'captcha' => array(
                    'captcha'   => 'Image', // Тип CAPTCHA
                    'wordLen'   => 4,       // Количество генерируемых символов
                    'width'     => 150,     // Ширина изображения
                    'timeout'   => 120,     // Время жизни сессии хранящей символы
                    'expiration'=> 300,     // Время жизни изображения в файловой системе
                    'font'      => 'design/fonts/arial.ttf',   // Путь к шрифту/ Обязательно отностельный
                    'imgDir'    => 'temporary/captcha/', // Путь к изобр. Обязательно отностельный
                    'imgUrl'    => $this->view->baseUrl . 'temporary/captcha/', // Адрес папки с изображениями
                    'gcFreq'    => 5        // Частота вызова сборщика мусора
                ),
            ));
            $form->addElement($captcha);
        }
        
        
		// кнопка сабмита
		$form->addElement('submit', 
						 'login', 
						 array('label' => $this->view->translate('user_restore_form_submit')));
		
		// ошибки
		$this->_helper->FormErrors($errors, $form);
		
		return $form;
	}  
     
/*------------------------------------------------------------------------------*/
}
